I manually picked 12 representatives from each category:

chicken_0116 chicken_0131 (so hard to distinguish) chicken_0181 chicken_0218 chicken_0264 chicken_0306 chicken_0383 chicken_0761 chicken_0646 chicken_0599 (only a leg) chicken_0891 (dark color) chicken_0999

dog_0010 dog_0021 (typical hair) dog_0023 dog_0033 dog_0095 dog_0146 (only a leg) dog_0147 dog_0342 (smooth surface) dog_0404 dog_0432 dog_0608 dog_0887

Some ideas: - Extract surface texture which stands out with curvy grains (? hard to realize) - Color RGB feature (success, 800 of them) - Color HSV feature

Here I pick 5 images (3 fried chickens and 2 dogs) to do an image exloration demo.

i1.c <- readImage("chicken_0116.jpg") #chicken 1
cannot open file 'chicken_0116.jpg': No such file or directorycannot open the connectionError in validImage(x) : object must be an array

Change to Greyscale, blue and red channels

rr for (i in 1:5) { file.bl[[i]]=channel(filename[[i]], mode=‘asblue’) display(channel(filename[[i]], mode=‘asblue’)) }

rr for (i in 1:5) { file.red[[i]]=channel(filename[[i]], mode=‘asred’) display(channel(filename[[i]], mode=‘asred’)) }

Extract the texture by high contrast on blue channel,

which really shows difference to me between fried chicken and dogs.

rr file.contrast=list() for (i in 1:5){ file.contrast=file.bl[[i]]5 display(file.bl[[i]]5) }

Filtering: high pass

rr filter_high <- matrix(1, nc = 3, nr = 3) filter_high[2, 2] <- -8 file.hi=list() for (i in 1:5){ file.hi <- filter2(filename[[i]], filter_high) display(file.hi)# high pass }

Adaptive thresholding

Outline Analysis

rr for (i in 1:5){ oc[[i]] <- ocontour(bwlabel(img_leaf1[[i]])) plot(oc[[i]][[1]], type=‘l’);points(oc[[i]][[1]], col=2) }

Color Features from RGB

By discretizing the RGB values, we can get a set of color features. We subdivide the pixel values in each color channel into multiple bands of equal width. Then the counts of pixels in correponding bins consist of a set of color features that characterizes the color distribution of the image.

mat=list()
freq_rgb=list()
rgb_feature=list()
nR <- 10
nG <- 8
nB <- 10 # Caution: the bins should be consistent across all images!
rBin <- seq(0, 1, length.out=nR)
gBin <- seq(0, 1, length.out=nG)
bBin <- seq(0, 1, length.out=nB)
for (i in 1:5){
  mat[[i]] <- imageData(filename[[i]])
  freq_rgb[[i]] <- as.data.frame(table(factor(findInterval(mat[[i]][,,1], rBin), levels=1:nR), factor(findInterval(mat[[i]][,,2], gBin), levels=1:nG), factor(findInterval(mat[[i]][,,3], bBin), levels=1:nB)))
  rgb_feature[[i]] <- as.numeric(freq_rgb[[i]]$Freq)/(ncol(mat[[i]])*nrow(mat[[i]])) # normalization
}
str(rgb_feature) #each image has 800 features
List of 5
 $ : num [1:800] 0.01379 0.02122 0.02635 0.02134 0.00368 ...
 $ : num [1:800] 0.00301 0.01485 0.01819 0.02569 0.02503 ...
 $ : num [1:800] 7.88e-06 1.38e-03 8.54e-03 9.58e-03 3.15e-04 ...
 $ : num [1:800] 0.001236 0.005528 0.006125 0.000306 0 ...
 $ : num [1:800] 0.01459 0.01061 0.01105 0.00498 0.00152 ...
#The number of bins for each color channel (nR,nG,nB) is a tuning parameter for constructing color features. The total number of features is nR*nG*nB.

Color Features From HSV

The Hue, Saturation, Value (HSV) model of color is closer to human perception of color, and thus is eaiser to interpret than RGB model. Using the same discretization, color features can be extracted from the histogram of HSV values.

hist(hsv_feature[[1]])
Error in hist(hsv_feature[[1]]) : object 'hsv_feature' not found
LS0tCnRpdGxlOiAiSW1hZ2UgRXhwbG9yYXRpb24iCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCkkgbWFudWFsbHkgcGlja2VkIDEyIHJlcHJlc2VudGF0aXZlcyBmcm9tIGVhY2ggY2F0ZWdvcnk6CgpjaGlja2VuXzAxMTYKY2hpY2tlbl8wMTMxIChzbyBoYXJkIHRvIGRpc3Rpbmd1aXNoKQpjaGlja2VuXzAxODEKY2hpY2tlbl8wMjE4CmNoaWNrZW5fMDI2NApjaGlja2VuXzAzMDYKY2hpY2tlbl8wMzgzCmNoaWNrZW5fMDc2MQpjaGlja2VuXzA2NDYKY2hpY2tlbl8wNTk5IChvbmx5IGEgbGVnKQpjaGlja2VuXzA4OTEgKGRhcmsgY29sb3IpCmNoaWNrZW5fMDk5OQoKZG9nXzAwMTAKZG9nXzAwMjEgKHR5cGljYWwgaGFpcikKZG9nXzAwMjMKZG9nXzAwMzMKZG9nXzAwOTUKZG9nXzAxNDYgKG9ubHkgYSBsZWcpCmRvZ18wMTQ3CmRvZ18wMzQyIChzbW9vdGggc3VyZmFjZSkKZG9nXzA0MDQKZG9nXzA0MzIKZG9nXzA2MDgKZG9nXzA4ODcKCgpTb21lIGlkZWFzOgotIEV4dHJhY3Qgc3VyZmFjZSB0ZXh0dXJlIHdoaWNoIHN0YW5kcyBvdXQgd2l0aCBjdXJ2eSBncmFpbnMgKD8gaGFyZCB0byByZWFsaXplKQotIENvbG9yIFJHQiBmZWF0dXJlIChzdWNjZXNzLCA4MDAgb2YgdGhlbSkKLSBDb2xvciBIU1YgZmVhdHVyZQoKCkhlcmUgSSBwaWNrIDUgaW1hZ2VzICgzIGZyaWVkIGNoaWNrZW5zIGFuZCAyIGRvZ3MpIHRvIGRvIGFuIGltYWdlIGV4bG9yYXRpb24gZGVtby4KYGBge3J9CnNldHdkKCJ+L0dvb2dsZSBEcml2ZS9Db2x1bWJpYS81MjQzIEFEUy9Qcm9qZWN0IDMvUHJvamVjdDNfcG9vZGxlS0ZDX3RyYWluL2ltYWdlcyIpCgpsaWJyYXJ5KCJFQkltYWdlIikKaTEuYyA8LSByZWFkSW1hZ2UoImNoaWNrZW5fMDExNi5qcGciKSAjY2hpY2tlbiAxCmkyLmMgPC0gcmVhZEltYWdlKCJjaGlja2VuXzA3NjEuanBnIikgI2NoaWNrZW4gMgppMS5kIDwtIHJlYWRJbWFnZSgiZG9nXzAwMjEuanBnIikgI2RvZyAxCmkyLmQgPC0gcmVhZEltYWdlKCJkb2dfMDYwOC5qcGciKSAjZG9nIDIKaTEgPC0gcmVhZEltYWdlKCJjaGlja2VuXzAxMzEuanBnIikgIyBoYXJkLXRvLWRpc3Rpbmd1aXNoIGNoaWNrZW4KCmZpbGVuYW1lPWxpc3QoaTEuYyxpMi5jLGkxLmQsaTIuZCxpMSkgI2xpc3QgYWxsIDUgaW1hZ2VzCgpvcHRpb25zKCJFQkltYWdlLmRpc3BsYXkiPSAicmFzdGVyIikgI2Rpc3BsYXkgaW4gUiByYXRoZXIgdGhhbiBpbiBicm93c2VyCgpwcmludChmaWxlbmFtZSkgI2RldGFpbGVkIGluZm8gb2YgYWxsIDUgaW1hZ2VzIAoKZm9yIChpIGluIDE6NSl7CiAgZGlzcGxheShmaWxlbmFtZVtbaV1dKSAgICNkaXNwbGF5IGltYWdlcwogIGhpc3QoZmlsZW5hbWVbW2ldXSkgICAgICAjUkdCIGhpc3RvZ3JhbXMKfQpgYGAKCgojQ2hhbmdlIHRvIEdyZXlzY2FsZSwgYmx1ZSBhbmQgcmVkIGNoYW5uZWxzCmBgYHtyfQpmaWxlLmJ3PWxpc3QoKQpmaWxlLmJsPWxpc3QoKQpmaWxlLnJlZD1saXN0KCkKCmZvciAoaSBpbiAxOjUpewogIGZpbGUuYndbW2ldXT1jaGFubmVsKGZpbGVuYW1lW1tpXV0sbW9kZT0iZ3JleSIpCiAgZGlzcGxheShmaWxlLmJ3W1tpXV0pCn0KCmZvciAoaSBpbiAxOjUpIHsKICBmaWxlLmJsW1tpXV09Y2hhbm5lbChmaWxlbmFtZVtbaV1dLCBtb2RlPSdhc2JsdWUnKQogIGRpc3BsYXkoY2hhbm5lbChmaWxlbmFtZVtbaV1dLCBtb2RlPSdhc2JsdWUnKSkKfQoKZm9yIChpIGluIDE6NSkgewogIGZpbGUucmVkW1tpXV09Y2hhbm5lbChmaWxlbmFtZVtbaV1dLCBtb2RlPSdhc3JlZCcpCiAgZGlzcGxheShjaGFubmVsKGZpbGVuYW1lW1tpXV0sIG1vZGU9J2FzcmVkJykpCn0KYGBgCgoKI0V4dHJhY3QgdGhlIHRleHR1cmUgYnkgaGlnaCBjb250cmFzdCBvbiBibHVlIGNoYW5uZWwsIAp3aGljaCByZWFsbHkgc2hvd3MgZGlmZmVyZW5jZSB0byBtZSBiZXR3ZWVuIGZyaWVkIGNoaWNrZW4gYW5kIGRvZ3MuCmBgYHtyfQpmaWxlLmNvbnRyYXN0PWxpc3QoKQpmb3IgKGkgaW4gMTo1KXsKICBmaWxlLmNvbnRyYXN0PWZpbGUuYmxbW2ldXSo1CiAgZGlzcGxheShmaWxlLmJsW1tpXV0qNSkKfQpgYGAKCiNGaWx0ZXJpbmc6IGhpZ2ggcGFzcwpgYGB7cn0KZmlsdGVyX2hpZ2ggPC0gbWF0cml4KDEsIG5jID0gMywgbnIgPSAzKQpmaWx0ZXJfaGlnaFsyLCAyXSA8LSAtOApmaWxlLmhpPWxpc3QoKQpmb3IgKGkgaW4gMTo1KXsKICBmaWxlLmhpIDwtIGZpbHRlcjIoZmlsZW5hbWVbW2ldXSwgZmlsdGVyX2hpZ2gpCiAgZGlzcGxheShmaWxlLmhpKSMgaGlnaCBwYXNzCn0KYGBgCgojQWRhcHRpdmUgdGhyZXNob2xkaW5nCmBgYHtyfQpmb3IgKGkgaW4gMTo1KXsKICBmaWxlLmJ3W1tpXV09Y2hhbm5lbChmaWxlbmFtZVtbaV1dLG1vZGU9ImdyZXkiKQogIGltZ19zZWcxIDwtIHRocmVzaChmaWxlLmJ3W1tpXV0sIHc9NjAsIGg9NjAsIG9mZnNldD0wLjA2KQogIGRpc3BsYXkoaW1nX3NlZzEsIGFsbD1UUlVFKQp9CmBgYAoKCiMgT3V0bGluZSBBbmFseXNpcwpgYGB7cn0KI09yaWVudGVkIENvbnRvdXIgIyMjIGRpZG4ndCBzZWUgYW55IHVzZSBoZXJlCmltZ19sZWFmPWxpc3QoKQppbWdfbGVhZjE9bGlzdCgpCm9jPWxpc3QoKQoKZm9yIChpIGluIDE6NSl7CiAgaW1nX2xlYWZbW2ldXSA8LSByZXNpemUoZmlsZW5hbWVbW2ldXSwgMTI4LCAxMjgpCiAgaW1nX2xlYWZbW2ldXSA8LSBjaGFubmVsKGltZ19sZWFmW1tpXV0sIG1vZGU9ImdyYXkiKQogIGltZ19sZWFmMVtbaV1dIDwtIHRocmVzaChpbWdfbGVhZltbaV1dLCB3PTUwLCBoPTUwLCBvZmZzZXQ9MC4wNSkKICBkaXNwbGF5KGltZ19sZWFmMVtbaV1dKX0KCmZvciAoaSBpbiAxOjUpewogIG9jW1tpXV0gPC0gb2NvbnRvdXIoYndsYWJlbChpbWdfbGVhZjFbW2ldXSkpCiAgcGxvdChvY1tbaV1dW1sxXV0sIHR5cGU9J2wnKTtwb2ludHMob2NbW2ldXVtbMV1dLCBjb2w9MikKfQpgYGAKCmBgYHtyfQojTG9jYWwgQ3VydmF0dXJlCmxjPWxpc3QoKQppPWxpc3QoKQpuZWc9bGlzdCgpCnBvcz1saXN0KCkKCmZvciAoayBpbiAxOjUpewogIGxjW1trXV0gPC0gbG9jYWxDdXJ2YXR1cmUoeD1vY1tba11dW1sxXV0sIGg9MTEpCiAgaVtba11dIDwtIGxjW1trXV0kY3VydmF0dXJlID49IDAKICBuZWdbW2tdXSA8LSBhcnJheSgwLCBkaW0oaW1nX2xlYWYxW1trXV0pKQogIHBvc1tba11dIDwtIG5lZ1tba11dCiAgcG9zW1trXV1bbGNbW2tdXSRjb250b3VyW2lbW2tdXSxdKzFdICA8LSBsY1tba11dJGN1cnZhdHVyZVtpW1trXV1dCiAgbmVnW1trXV1bbGNbW2tdXSRjb250b3VyWyFpW1trXV0sXSsxXSA8LSAtbGNbW2tdXSRjdXJ2YXR1cmVbIWlbW2tdXV0KICBkaXNwbGF5KDEwKihyZ2JJbWFnZShwb3NbW2tdXSwgLCBuZWdbW2tdXSkpLCB0aXRsZSA9ICJJbWFnZSBjdXJ2YXR1cmUiKQp9CmBgYAoKI0NvbG9yIEZlYXR1cmVzIGZyb20gUkdCCgpCeSBkaXNjcmV0aXppbmcgdGhlIFJHQiB2YWx1ZXMsIHdlIGNhbiBnZXQgYSBzZXQgb2YgY29sb3IgZmVhdHVyZXMuIFdlIHN1YmRpdmlkZSB0aGUgcGl4ZWwgdmFsdWVzIGluIGVhY2ggY29sb3IgY2hhbm5lbCBpbnRvIG11bHRpcGxlIGJhbmRzIG9mIGVxdWFsIHdpZHRoLiBUaGVuIHRoZSBjb3VudHMgb2YgcGl4ZWxzIGluIGNvcnJlcG9uZGluZyBiaW5zIGNvbnNpc3Qgb2YgYSBzZXQgb2YgY29sb3IgZmVhdHVyZXMgdGhhdCBjaGFyYWN0ZXJpemVzIHRoZSBjb2xvciBkaXN0cmlidXRpb24gb2YgdGhlIGltYWdlLgpgYGB7cn0KbWF0PWxpc3QoKQpmcmVxX3JnYj1saXN0KCkKcmdiX2ZlYXR1cmU9bWF0cml4KG5yb3c9NSwgbmNvbD1uUipuRypuQikKCm5SIDwtIDEwCm5HIDwtIDgKbkIgPC0gMTAgIyBDYXV0aW9uOiB0aGUgYmlucyBzaG91bGQgYmUgY29uc2lzdGVudCBhY3Jvc3MgYWxsIGltYWdlcyEKckJpbiA8LSBzZXEoMCwgMSwgbGVuZ3RoLm91dD1uUikKZ0JpbiA8LSBzZXEoMCwgMSwgbGVuZ3RoLm91dD1uRykKYkJpbiA8LSBzZXEoMCwgMSwgbGVuZ3RoLm91dD1uQikKCmZvciAoaSBpbiAxOjUpewogIG1hdFtbaV1dIDwtIGltYWdlRGF0YShmaWxlbmFtZVtbaV1dKQogIGZyZXFfcmdiW1tpXV0gPC0gYXMuZGF0YS5mcmFtZSh0YWJsZShmYWN0b3IoZmluZEludGVydmFsKG1hdFtbaV1dWywsMV0sIHJCaW4pLCBsZXZlbHM9MTpuUiksIGZhY3RvcihmaW5kSW50ZXJ2YWwobWF0W1tpXV1bLCwyXSwgZ0JpbiksIGxldmVscz0xOm5HKSwgZmFjdG9yKGZpbmRJbnRlcnZhbChtYXRbW2ldXVssLDNdLCBiQmluKSwgbGV2ZWxzPTE6bkIpKSkKICByZ2JfZmVhdHVyZVtpLF0gPC0gYXMubnVtZXJpYyhmcmVxX3JnYltbaV1dJEZyZXEpLyhuY29sKG1hdFtbaV1dKSpucm93KG1hdFtbaV1dKSkgIyBub3JtYWxpemF0aW9uCn0KCnN0cihyZ2JfZmVhdHVyZSkgI2VhY2ggaW1hZ2UgaGFzIDgwMCBmZWF0dXJlcwojVGhlIG51bWJlciBvZiBiaW5zIGZvciBlYWNoIGNvbG9yIGNoYW5uZWwgKG5SLG5HLG5CKSBpcyBhIHR1bmluZyBwYXJhbWV0ZXIgZm9yIGNvbnN0cnVjdGluZyBjb2xvciBmZWF0dXJlcy4gVGhlIHRvdGFsIG51bWJlciBvZiBmZWF0dXJlcyBpcyBuUipuRypuQi4KYGBgCgojQ29sb3IgRmVhdHVyZXMgRnJvbSBIU1YKClRoZSBIdWUsIFNhdHVyYXRpb24sIFZhbHVlIChIU1YpIG1vZGVsIG9mIGNvbG9yIGlzIGNsb3NlciB0byBodW1hbiBwZXJjZXB0aW9uIG9mIGNvbG9yLCBhbmQgdGh1cyBpcyBlYWlzZXIgdG8gaW50ZXJwcmV0IHRoYW4gUkdCIG1vZGVsLiBVc2luZyB0aGUgc2FtZSBkaXNjcmV0aXphdGlvbiwgY29sb3IgZmVhdHVyZXMgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIHRoZSBoaXN0b2dyYW0gb2YgSFNWIHZhbHVlcy4KYGBge3J9CmxpYnJhcnkoZ3JEZXZpY2VzKQoKbkggPC0gMTAKblMgPC0gNgpuViA8LSA2CiMgQ2F1dGlvbjogZGV0ZXJtaW5lIHRoZSBiaW5zIHVzaW5nIGFsbCBpbWFnZXMhIFRoZSBiaW5zIHNob3VsZCBiZSBjb25zaXN0ZW50IGFjcm9zcyBhbGwgaW1hZ2VzLiBUaGUgZm9sbG93aW5nIGNvZGUgaXMgb25seSB1c2VkIGZvciBkZW1vbnN0cmF0aW9uIG9uIGEgc2luZ2xlIGltYWdlLgpoQmluIDwtIHNlcSgwLCAxLCBsZW5ndGgub3V0PW5IKQpzQmluIDwtIHNlcSgwLCAxLCBsZW5ndGgub3V0PW5TKQp2QmluIDwtIHNlcSgwLCAwLjAwNSwgbGVuZ3RoLm91dD1uVikgCgojIENvbnZlcnQgM2QgYXJyYXkgb2YgUkdCIHRvIDJkIG1hdHJpeAoKbWF0X3JnYiA8LSBtYXQKbWF0X2hzdiA8LSBsaXN0KCkKZnJlcV9oc3YgPC0gbGlzdCgpCmhzdl9mZWF0dXJlIDwtIG1hdHJpeChucm93PTUsIG5jb2w9bkgqblMqblYpCgpmb3IgKGkgaW4gMTo1KXsKICBkaW0obWF0X3JnYltbaV1dKSA8LSBjKG5yb3cobWF0W1tpXV0pKm5jb2wobWF0W1tpXV0pLCAzKQogIG1hdF9oc3ZbW2ldXSA8LSByZ2IyaHN2KHQobWF0X3JnYltbaV1dKSkKCiAgZnJlcV9oc3ZbW2ldXSA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlKGZhY3RvcihmaW5kSW50ZXJ2YWwobWF0X2hzdltbaV1dWzEsXSwgaEJpbiksIGxldmVscz0xOm5IKSwgZmFjdG9yKGZpbmRJbnRlcnZhbChtYXRfaHN2W1tpXV1bMixdLCBzQmluKSwgbGV2ZWxzPTE6blMpLCAgZmFjdG9yKGZpbmRJbnRlcnZhbChtYXRfaHN2W1tpXV1bMyxdLCB2QmluKSwgbGV2ZWxzPTE6blYpKSkKICAKICBoc3ZfZmVhdHVyZVtpLF0gPC0gYXMubnVtZXJpYyhmcmVxX2hzdltbaV1dJEZyZXEpLyhuY29sKG1hdFtbaV1dKSpucm93KG1hdFtbaV1dKSkgIyBub3JtYWxpemF0aW9uCn0KcGxvdChoc3ZfZmVhdHVyZVtbMV1dLHR5cGU9ImwiKQpkaW0oaHN2X2ZlYXR1cmUpICMgMzYwIEhTViBmZWF0dXJlcwojVGhlIG51bWJlciBvZiBiaW5zIGZvciBlYWNoIG1vZGVsIChuSCxuUyxuVikgaXMgYSB0dW5pbmcgcGFyYW1ldGVyIGZvciBjb25zdHJ1Y3RpbmcgY29sb3IgZmVhdHVyZXMuIFRoZSB0b3RhbCBudW1iZXIgb2YgZmVhdHVyZXMgaXMgbkhuU25WLgpgYGAKCg==